]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
osdWindow: Show on all monitors
authorAdel Gadllah <adel.gadllah@gmail.com>
Thu, 17 Apr 2014 08:23:30 +0000 (10:23 +0200)
committerAdel Gadllah <adel.gadllah@gmail.com>
Thu, 17 Apr 2014 13:15:14 +0000 (15:15 +0200)
We had one osdWindow that we displayed either on the primary monitor or on
whatever monitor index got passed over dbus.

Change that to show the osd on all monitors when no explicit monitor is
requested. A monitor should be requested in cases like display brightness where it makes sense to only show the osd on the affected monitor.

https://bugzilla.gnome.org/show_bug.cgi?id=722684

js/ui/main.js
js/ui/osdWindow.js
js/ui/shellDBus.js
js/ui/switcherPopup.js

index bf2540102f226968e403a3e6315488976aa2f592..22a561fc9ea9e76ad80cd7724385ba2bb21093e2 100644 (file)
@@ -55,7 +55,7 @@ let screenShield = null;
 let notificationDaemon = null;
 let windowAttentionHandler = null;
 let ctrlAltTabManager = null;
-let osdWindow = null;
+let osdWindowManager = null;
 let sessionMode = null;
 let shellDBusService = null;
 let shellMountOpDBusService = null;
@@ -155,7 +155,7 @@ function _initializeUI() {
     screencastService = new Screencast.ScreencastService();
     xdndHandler = new XdndHandler.XdndHandler();
     ctrlAltTabManager = new CtrlAltTab.CtrlAltTabManager();
-    osdWindow = new OsdWindow.OsdWindow();
+    osdWindowManager = new OsdWindow.OsdWindowManager();
     overview = new Overview.Overview();
     wm = new WindowManager.WindowManager();
     magnifier = new Magnifier.Magnifier();
index 2513aa8435842679fbd5bcf38068d49981a5f842..1916812bf548877bcd67edb04ca82258d09d5610 100644 (file)
@@ -73,14 +73,17 @@ const LevelBar = new Lang.Class({
 const OsdWindow = new Lang.Class({
     Name: 'OsdWindow',
 
-    _init: function() {
+    _init: function(monitorIndex) {
         this._popupSize = 0;
         this.actor = new St.Widget({ x_expand: true,
                                      y_expand: true,
                                      x_align: Clutter.ActorAlign.CENTER,
                                      y_align: Clutter.ActorAlign.CENTER });
-        this._currentMonitor = undefined;
-        this.setMonitor (-1);
+
+        this._monitorIndex = monitorIndex;
+        let constraint = new Layout.MonitorConstraint({ index: monitorIndex });
+        this.actor.add_constraint(constraint);
+
         this._box = new St.BoxLayout({ style_class: 'osd-window',
                                        vertical: true });
         this.actor.add_actor(this._box);
@@ -109,7 +112,6 @@ const OsdWindow = new Lang.Class({
         Main.layoutManager.connect('monitors-changed',
                                    Lang.bind(this, this._monitorsChanged));
         this._monitorsChanged();
-
         Main.uiGroup.add_child(this.actor);
     },
 
@@ -189,12 +191,7 @@ const OsdWindow = new Lang.Class({
 
     _monitorsChanged: function() {
         /* assume 110x110 on a 640x480 display and scale from there */
-        let monitor;
-
-        if (this._currentMonitor >= 0)
-            monitor = Main.layoutManager.monitors[this._currentMonitor];
-        else
-            monitor = Main.layoutManager.primaryMonitor;
+        let monitor = Main.layoutManager.monitors[this._monitorIndex];
 
         let scalew = monitor.width / 640.0;
         let scaleh = monitor.height / 480.0;
@@ -223,23 +220,56 @@ const OsdWindow = new Lang.Class({
         // but the theme takes measures in unscaled dimensions
         let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
         this._box.style = 'min-height: %dpx;'.format(Math.max(minWidth, minHeight) / scaleFactor);
+    }
+});
+
+const OsdWindowManager = new Lang.Class({
+    Name: 'OsdWindowManager',
+
+    _init: function() {
+        this._osdWindows = [];
+        Main.layoutManager.connect('monitors-changed',
+                                    Lang.bind(this, this._monitorsChanged));
+        this._monitorsChanged();
     },
 
-    setMonitor: function(index) {
-        let constraint;
+    _monitorsChanged: function() {
+        for (let i = 0; i < Main.layoutManager.monitors.length; i++) {
+            if (this._osdWindows[i] == undefined)
+                this._osdWindows[i] = new OsdWindow(i);
+        }
 
-        if (index < 0)
-            index = -1;
-        if (this._currentMonitor == index)
-            return;
+        for (let i = Main.layoutManager.monitors.length; i < this._osdWindows.length; i++) {
+            this._osdWindows[i].actor.destroy();
+            this._osdWindows[i] = null;
+        }
 
-        if (index < 0)
-            constraint = new Layout.MonitorConstraint({ primary: true });
-        else
-            constraint = new Layout.MonitorConstraint({ index: index });
+        this._osdWindows.length = Main.layoutManager.monitors.length;
+    },
 
-        this.actor.clear_constraints();
-        this.actor.add_constraint(constraint);
-        this._currentMonitor = index;
+    _showOsdWindow: function(monitorIndex, icon, label, level) {
+        this._osdWindows[monitorIndex].setIcon(icon);
+        this._osdWindows[monitorIndex].setLabel(label);
+        this._osdWindows[monitorIndex].setLevel(level);
+        this._osdWindows[monitorIndex].show();
+    },
+
+    show: function(monitorIndex, icon, label, level) {
+        if (monitorIndex != -1) {
+            for (let i = 0; i < this._osdWindows.length; i++) {
+                if (i == monitorIndex)
+                    this._showOsdWindow(i, icon, label, level);
+                else
+                    this._osdWindows[i].cancel();
+            }
+        } else {
+            for (let i = 0; i < this._osdWindows.length; i++)
+                this._showOsdWindow(i, icon, label, level);
+        }
+    },
+
+    hideAll: function() {
+        for (let i = 0; i < this._osdWindows.length; i++)
+            this._osdWindows[i].cancel();
     }
 });
index 52e9fa8f6f688c2cbf68d7a15115f66df6a0f53f..a87ea4171eb1a5c8e21cd1c9e63f0ec28d55ff75 100644 (file)
@@ -141,12 +141,7 @@ const GnomeShell = new Lang.Class({
         if (params['icon'])
             icon = Gio.Icon.new_for_string(params['icon']);
 
-        Main.osdWindow.setIcon(icon);
-        Main.osdWindow.setMonitor (monitorIndex);
-        Main.osdWindow.setLabel(params['label']);
-        Main.osdWindow.setLevel(params['level']);
-
-        Main.osdWindow.show();
+        Main.osdWindowManager.show(monitorIndex, icon, params['label'], params['level']);
     },
 
     FocusApp: function(id) {
index bd7875f8d87804dd17e837f61b5b068b08707c2a..f7b8897e8f67eda8108403c0aeda1de1b33e0879 100644 (file)
@@ -161,7 +161,7 @@ const SwitcherPopup = new Lang.Class({
         // disturbed by the popup briefly flashing.
         this._initialDelayTimeoutId = Mainloop.timeout_add(POPUP_DELAY_TIMEOUT,
                                                            Lang.bind(this, function () {
-                                                               Main.osdWindow.cancel();
+                                                               Main.osdWindowManager.hideAll();
                                                                this.actor.opacity = 255;
                                                                this._initialDelayTimeoutId = 0;
                                                                return GLib.SOURCE_REMOVE;